<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Symbol.for(),Symbol.keyFor()</title>
</head>
<body>
  <script>
    var a = 0;
    /**
     * 有时，我们希望重新使用同一个Symbol值，Symbol.for()方法可以做到这一点。
     * 它接受一个字符串作为参数，然后搜索有没有以该参数作为名称的Symbol值。如果有
     * 就返回这个Symbol值，否则就新建一个以该字符串为名称的Symbol值，并将其注册到全局
    */
   var s1 = Symbol.for('foo');
   var s2 = Symbol.for('foo');
   s1 === s2 // true
   // 上面代码中，s1和s2都是Symbol值，但是它们都是同样参数的Symbol.for方法生成的，所以实际上是同一个值。
   var a = 0;
   /**
    * Symbol.for()和Symbol()这俩种写法都会生成新的Symbol，它门的区别是，前者会被登记在全局环境中供搜索，。
    后者不会，Symbol.for()不会每次调用就返回一个新的Symbol类型的值，而是会 先检查给定的Key是否已经存在，如果不存在
    才会新建一个值。比如你调用Symbol.for('cat')30次。每次都返回同一个Symbol值，但是调用Symbol('cat')30次，
    会返回30个不同的Symbol值。
   */
   // Symbol.keyFor()方法，。返回一个已登记的Symbol类型的key.
   var s1 = Symbol.for('cat');
   var a = Symbol.keyFor(s1);
   console.log(a); //cat
   var s2 = Symbol("foo");
   Symbol.keyFor(s2); // undefined
   /**
    * 上面代码中，变量s2属于未登记的Symbol值，所以返回undefined。
    * 注意：Symbol.for()为Symbol值登记的名字，是全局环境的，不管有没有在全局环境运行。
   */
  function foo() {
    return Symbol.for('bar')
  }
  var x = foo();
  var y = Symbol.for('bar');
  console.log(x === y); // true
  /**
   * 上面代码中Symbol.for('bar')是函数内部运行的，但是生成的Symbol值是登记在全局环境的。
   * 所以第二次运行Symbol.for('bar')可以取到这个Symbol值。
   * 利用这个全局登记特性，可以用在不同的ifram或service worker中取到同一个值。
  */
 var ifarme = document.createElement('iframe');
 ifarme.src = String(Window.location);
 document.body.appendChild(ifarme);
 ifarme.contentWindow.Symbol.for('foo') === Symbol.for('foo'); // true
 // 上面代码中，iframe窗口生成的Symbol值，可以在主页面得到、
  </script>
</body>
</html>